#include<iostream>
#include<cassert>
#include<cstring>
#include<signal.h>
#include<unistd.h>

using namespace std;

//打印pending表
void printPending(const sigset_t &pending)
{
    for(int signo=1;signo<=31;signo++)
    {
        //查询pending表内是否有signo号信号
        if(sigismember(&pending,signo))
        {
            cout<<1;
        }
        else
        {
            cout<<0;
        }
    }
    cout<<endl;
}

//自定义动作
void handler(int signo)
{
    cout<<"对特定信号:"<<signo<<"执行捕捉动作"<<endl;
    int cnt=30;
    while(cnt--)
    {
        //获取pending表
        sigset_t pending;
        sigemptyset(&pending);
        sigpending(&pending);
        //打印pending表
        printPending(pending);
        sleep(1);
    }
}

int main()
{
    struct sigaction act,oldact;
    memset(&act,0,sizeof(act));
    memset(&oldact,0,sizeof(oldact));
    act.sa_flags=0;
    //自定义动作
    act.sa_handler=handler;
    //执行自定义动作时对3,4,5信号也进行阻塞
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask,3);
    sigaddset(&act.sa_mask,4);
    sigaddset(&act.sa_mask,5);
    
    //对2号信号进行捕捉
    sigaction(2,&act,&oldact);

    while(true)
    {
        cout<<getpid()<<"进程执行中..."<<endl;
        sleep(1);
    }

    return 0;
}



// int main()
// {
//     //信号集
//     //set是更改的信号集，oset获取旧的信号集
//     sigset_t set,oset;
//     //将两个信号集都置0
//     sigemptyset(&set);
//     sigemptyset(&oset);

//     //添加阻塞的信号，如2号信号
//     sigaddset(&set,2);

//     //阻塞信号
//     sigprocmask(SIG_BLOCK,&set,&oset);

//     int cnt=0;
//     //获取pending表
//     while(true)
//     {
//         sigset_t pending;
//         sigemptyset(&pending);
//         //获取pending表
//         int n=sigpending(&pending);
//         assert(n==0);
//         (void)n;//使用一下n变量，防止release版本assert被忽略，而引发的报错
//         //打印pending表
//         printPending(pending);
//         //休眠一下
//         sleep(1);
//         if(cnt++==10)
//         {
//             //先打印
//             cout<<"解除对2号信号的屏蔽"<<endl;
//             //oset保留的是原先的block表
//             sigprocmask(SIG_SETMASK,&oset,nullptr);
//         }
//     }

//     return 0;
// }

